import win32com,os
from win32com.client import Dispatch, constants
class WordApp:
    '''

    word文档操作帮助类
    '''
    def __init__(self):
        self.app = win32com.client.DispatchEx('Word.Application')
        self.app.Visible = 0
        self.app.DisplayAlerts = 0
    def setVisible(self,isVisible=False):
        '''
        设置是否显示word操作界面
        :param isVisible: bool型，true为显示
        :return:
        '''
        if isVisible:
            self.app.Visible=1
        return self.app.Visible
    def replaceStr(self,oldstr:str,newstr:str):
        '''
        替换文本
        :param oldstr: 要替换的文本
        :param newstr: 替换的文本
        :return:
        '''
        self.app.Selection.Find.ClearFormatting()
        self.app.Selection.Find.Replacement.ClearFormatting()
        self.app.Selection.Find.Execute(oldstr, False, False, False, False, False, True, 1, True,
                                        newstr, 2)
    def save(self):
        '''
        直接保存当前文档
        :return:
        '''
        self.app.ActiveDocument.Save()
    def saveAs(self,path="example.docx"):
        '''
        另存当前word文档为path
        :param path: 另存为的绝对路径
        :return:
        '''
        self.app.ActiveDocument.SaveAs(path)
    def open(self,file:str=None):
        '''
        打开word文档，如果file为空则新建一个文档
        :param file: 要打开文档的绝对路径
        :return:
        '''
        self.file=file
        if self.file==None:
            print("未发现文档，新建一个文档")
            self.doc = self.app.Documents.Add()
        else:
            self.doc=self.app.Documents.Open(file)
    def getText(self):
        '''
        获取word所有文本
        :return: word所有文本
        '''
        text=""
        for i in range(self.doc.Paragraphs.Count):
            print(self.doc.Paragraphs[i].Range)
            try:
                text += self.doc.Paragraphs[i].Range
            except Exception as err:
                pass
        return text
    def insertPic(self,src):
        '''
        插入图片
        :param src: 图片绝对位置
        :return:
        '''
        self.app.Selection.InlineShapes.AddPicture(src)
    def quit(self):
        self.app.Quit()
    def selectAll(self):
        '''
        全选word文本
        :return:
        '''
        self.app.Selection.WholeStory()
    def getTextCount(self):
        '''
        获取word文档全文字数
        :return: word文档全文字数
        '''
        return self.app.ActiveDocument.Characters.Count
    def getParagraphsCount(self):
        '''
        获取word文档全文字数
        :return: word文档全文字数
        '''
        return self.app.ActiveDocument.Paragraphs.Count
    def getHeaderFooter(self):
        '''
        获取当前word对象的页眉对象
        :return: 当前word对象的页眉对象
        '''
        return  self.app.ActiveDocument.Sections(1).Headers(1).Range
    def setHeaderFooter(self,newheaderstr):
        '''
        替换当前页眉中的文本
        :param newheaderstr: 替换文本 文本型
        :return: none
        '''
        self.app.ActiveDocument.Sections(1).Headers(1).Range.Text=newheaderstr
    def close(self):
        '''
        关闭当前word实例
        :return:
        '''
        self.doc.Close()
    def replaceHeaderStr(self,oldstr:str,newstr:str):
        '''
        替换word页眉中的文本
        :param oldstr: 页眉中的原文本
        :param newstr: 替换文本
        :return: None
        '''
        self.getHeaderFooter().Find.ClearFormatting()
        self.getHeaderFooter().Find.Replacement.ClearFormatting()
        self.getHeaderFooter().Find.Execute(oldstr, False, False, False, False, False, True, 1, True,
                                        newstr, 2)
if __name__ == '__main__':
    app=WordApp()
    app.open(os.path.abspath(r"../病历自动生成\病历书写模板.docx") )
    初步诊断="""
    1.高血压
    2.糖尿病
    3.不稳定型心绞痛 心功能II级
    """
    姓名='''高凯'''
    主诉='腹泻12天'
    app.setVisible(True)
    app.replaceStr("$初步诊断$",初步诊断)
    app.replaceStr("$姓名$",姓名)
    app.replaceStr("$主诉$",主诉)
    app.replaceStr("住院号","200000")
    app.replaceStr("床号","15床")

    床号="12床"
    住院号=30000202
    headerstr=f"科别:全科（内二）       病区:              床号:{床号}                    住院号:{住院号}"
    print(app.getHeaderFooter())
    app.replaceHeaderStr("$床号$","100床")
    app.replaceHeaderStr("$住院号$","100床")
    import time
    time.sleep(4)
    app.saveAs(os.getcwd()+"/ppp.docx")
    app.close()
    app.quit()
    #app.saveAs()
    #app.quit()